//
// import 'package:flutter/widgets.dart';
//
// /// cache gif fetched image
// class GifCache{
//   final Map<String,List<ImageInfo>> caches= {};
//
//   void clear() {
//     caches.clear();
//   }
//
//   bool evict(Object key) {
//     final List<ImageInfo>? pendingImage = caches.remove(key);
//     if(pendingImage!=null){
//       return true;
//     }
//     return false;
//   }
// }
//
// /// controll gif
// class GifController extends AnimationController{
//
//   GifController({
//     required TickerProvider vsync,
//     double value = 0.0,
//     Duration? reverseDuration,
//     Duration? duration,
//   }) : super.unbounded(
//       value: value,
//       reverseDuration: reverseDuration,
//       duration: duration,
//       vsync: vsync);
//
//   @override
//   void reset() {
//     value = 0.0;
//   }
// }
//
//
// class GifImage extends StatefulWidget{
//   const GifImage({
//     @required this.image,
//     @required this.controller,
//     this.semanticLabel,
//     this.excludeFromSemantics = false,
//     this.width,
//     this.height,
//     this.onFetchCompleted,
//     this.color,
//     this.colorBlendMode,
//     this.fit,
//     this.alignment = Alignment.center,
//     this.repeat = ImageRepeat.noRepeat,
//     this.centerSlice,
//     this.matchTextDirection = false,
//     this.gaplessPlayback = false,
//   });
//   final VoidCallback? onFetchCompleted;
//   final GifController? controller;
//   final ImageProvider? image;
//   final double? width;
//   final double? height;
//   final Color? color;
//   final BlendMode? colorBlendMode;
//   final BoxFit? fit;
//   final AlignmentGeometry alignment;
//   final ImageRepeat repeat;
//   final Rect? centerSlice;
//   final bool matchTextDirection;
//   final bool gaplessPlayback;
//   final String? semanticLabel;
//   final bool excludeFromSemantics;
//
//   @override
//   State<StatefulWidget> createState() {
//     return GifImageState();
//   }
//
//   static GifCache cache = GifCache();
// }
//
// class GifImageState extends State<GifImage> {
//   List<ImageInfo>? _infos;
//   int _curIndex = 0;
//   bool _fetchComplete = false;
//
//   ImageInfo? get _imageInfo {
//     if (!_fetchComplete) return null;
//     return _infos == null ? null : _infos?[_curIndex];
//   }
//
//   @override
//   void initState() {
//     super.initState();
//     widget.controller?.addListener(_listener);
//   }
//
//   @override
//   void dispose() {
//     super.dispose();
//     widget.controller?.removeListener(_listener);
//   }
//
//   @override
//   void didUpdateWidget(GifImage oldWidget) {
//     super.didUpdateWidget(oldWidget);
//     if (widget.image != oldWidget.image) {
//       if(mounted) {
//         setState(() {
//           _fetchComplete=true;
//           _curIndex = widget.controller?.value.toInt() ?? 0;
//           if(widget.onFetchCompleted!=null){
//             // widget?.onFetchCompleted();
//           }
//         });
//       }
//     }
//     if (widget.controller != oldWidget.controller) {
//       oldWidget.controller?.removeListener(_listener);
//       widget.controller?.addListener(_listener);
//     }
//   }
//
//   void _listener(){
//     if (_curIndex != widget.controller?.value && _fetchComplete) {
//       if(mounted) {
//         setState(() {
//           _curIndex = widget.controller?.value.toInt() ?? 0;
//         });
//       }
//     }
//   }
//
//   @override
//   void didChangeDependencies() {
//     super.didChangeDependencies();
//     if(_infos==null){
//       if(mounted) {
//         setState(() {
//           _fetchComplete=true;
//           _curIndex = widget.controller?.value.toInt()??0;
//           if(widget.onFetchCompleted!=null){
//             // widget?.onFetchCompleted();
//           }
//         });
//       }
//     }
//   }
//
//   @override
//   Widget build(BuildContext context) {
//     final RawImage image = RawImage(
//       image: _imageInfo?.image,
//       width: widget.width,
//       height: widget.height,
//       scale: _imageInfo?.scale ?? 1.0,
//       color: widget.color,
//       colorBlendMode: widget.colorBlendMode,
//       fit: widget.fit,
//       alignment: widget.alignment,
//       repeat: widget.repeat,
//       centerSlice: widget.centerSlice,
//       matchTextDirection: widget.matchTextDirection,
//     );
//     if (widget.excludeFromSemantics) {
//       return image;
//     }
//     return Semantics(
//       container: widget.semanticLabel != null,
//       image: true,
//       label: widget.semanticLabel ?? '',
//       child: image,
//     );
//   }
// }
